import javax.xml.parsers.*; 
import org.w3c.dom.*; 
import org.xml.sax.*; 
import java.io.*; 
import java.util.ArrayList;

public class DOM{
	public static void printNode(Node node){
		System.out.println(node);
		NodeList nodes = node.getChildNodes();
		for(int i=0; i<nodes.getLength(); i++){
			Node n = nodes.item(i);
			printNode(n);
		}
	}
	
	public static void printChildNode(Node node){
		System.out.println(node);
		if (node.hasChildNodes()){
			NodeList nodes = node.getChildNodes();
			for(int i=0; i<nodes.getLength(); i++){
				Node n = nodes.item(i);
				System.out.println(n);
			}
		}
	}
	
	public static void printDocument(String fichierXML){
		Document document = parser(fichierXML);
		Element racine = document.getDocumentElement();
		printNode(racine);
	}
	
	public static Document parser(String fichierXML){
		Document document = null;
		try{
			// cration d'une fabrique de documents
			DocumentBuilderFactory fabrique = DocumentBuilderFactory.newInstance();
			
			// cration d'un constructeur de documents
			DocumentBuilder constructeur = fabrique.newDocumentBuilder();
			
			// lecture du contenu d'un fichier XML avec DOM
			File xml = new File(fichierXML);
			document = constructeur.parse(xml);
			
		}catch(ParserConfigurationException pce){
			System.out.println("Erreur de configuration du parseur DOM");
			System.out.println("lors de l'appel a fabrique.newDocumentBuilder();");
		}catch(SAXException se){
			System.out.println("Erreur lors du parsing du document");
			System.out.println("lors de l'appel a construteur.parse(xml)");
		}catch(IOException ioe){
			System.out.println("Erreur d'entree/sortie");
			System.out.println("lors de l'appel a construteur.parse(xml)");
		}
		return document;
	}
	
	public static Node getPartieFix(String fichierXML, String tag, int i){
		Document document = parser(fichierXML);
		Element racine = document.getDocumentElement();
		NodeList nodeList = racine.getElementsByTagName(tag);
		Node partieFix = nodeList.item(i);
		return partieFix; 
	}
	
	public static NodeList getPartiesFix(String fichierXML, String tag){
		Document document = parser(fichierXML);
		Element racine = document.getDocumentElement();
		NodeList nodeList = racine.getElementsByTagName(tag);
		return nodeList;
	}
	
	//Recherche dans le fichier XML, le premier node avec l'attribut "label" specifier
	public static Node recherche(String fichierXML, String tag, String label){
		Document document = parser(fichierXML);
		Element racine = document.getDocumentElement();
		NodeList nodeList = racine.getElementsByTagName(tag);
		boolean trouver = false;
		int i=0;
		while (i<nodeList.getLength() && trouver!=true){
			trouver = (((Element) nodeList.item(i)).getAttribute("label").equals("this/Jour"))?true:false;
			i=(trouver==true)?i:i+1;
		}
		return nodeList.item(i);
	}
	
	//retourne une liste de Node dont le ParentID est passe en parametre 
	public static ArrayList<Node> listeNode(String fichierXML, String tag, String ParentID){
		Document document = parser(fichierXML);
		Element racine = document.getDocumentElement();
		NodeList nodeList = racine.getElementsByTagName(tag);
		ArrayList<Node> resultat = new ArrayList<Node>();
		for (int i=0;i<nodeList.getLength();i++){
			if (((Element) nodeList.item(i)).getAttribute("parentID").equals(ParentID)){
				resultat.add(nodeList.item(i));
			}
		}
		return resultat;
	}
	
}   
